package com.apestech.framework.file;

import com.apestech.framework.util.StringUtil;

/**
 * 文件搜索基类，用于出文件查找匹配算法
 * @author hupo
 *
 */
public class FileFind extends StringUtil {
	
	public enum FileFindType {
		SAME(0), ALL(1), EXT(2), FILE(3), EXT_ALL(4), FILE_ALL(5), FILE_LIKE(6), EXT_LIKE(7), LIKE(8);  
	      
	    int value;  
	      
	    FileFindType(int value) {  
	        this.value = value;  
	    }  
	      
	    public int getValue() {  
	        return value;  
	    }  
	}
	
	public class FileMemo<A, B, C> {  
	    public A file;  
	    public B ext;
	    public C type;
	    
	    public FileMemo(A a, B b, C c) {  
	    	file = a;  
	    	ext = b;  
	    	type =c;
	    }  
	}
	
	private String inputFileName;
	private FileMemo fmemo;
	
	public FileFind(String fileName){
		this.inputFileName=fileName.toUpperCase();
		if(fileName==null) return;
		this.fmemo=getFileFileFindType(this.inputFileName);
	}
	
	/**
	 * 匹配文件名是否符合条件
	 * @param fileName
	 * @return
	 */
	public boolean isMate(String fileName){
		if(fileName==null) return true;
		if(this.fmemo==null) return true;
		fileName=fileName.toUpperCase();
		FileMemo dmemo=getFileFileFindType(fileName);
		if(dmemo.ext.equals("HTML")){
			System.out.println(fileName);
		}
		if(this.fmemo.type==FileFindType.SAME){
			if(fileName.equals(this.inputFileName)){
				return true;
			} 
		} else if(this.fmemo.type==FileFindType.EXT){
			if(dmemo.ext.equals(this.fmemo.ext)){
				return true;
			}
		} else if(this.fmemo.type==FileFindType.FILE){
			if(dmemo.file.equals(this.fmemo.file)){
				return true;
			}
		} else if(this.fmemo.type==FileFindType.ALL){
			return true;
		} else if(this.fmemo.type==FileFindType.EXT_ALL){
			if(dmemo.file.equals(this.fmemo.file)){
				return true;
			}
		} else if(this.fmemo.type==FileFindType.FILE_ALL){
			if(dmemo.ext.equals(this.fmemo.ext)){
				return true;
			}
		} else {
			String file=(String) this.fmemo.file;
			String ext=(String) this.fmemo.ext;
			file=file.replace("*", "#");
			ext=ext.replace("*", "#");
			boolean blike=false;
			if(this.fmemo.type==FileFindType.LIKE){
				blike=rightStr(file, 1).equals("#");
				boolean flag=like(file.split("#"), (String) dmemo.file, blike);
				if(flag){
					blike=rightStr(ext, 1).equals("#");
					flag=like(ext.split("#"), (String) dmemo.file, blike);
				}
				return flag;
			} else if(this.fmemo.type==FileFindType.FILE_LIKE){
				blike=rightStr(file, 1).equals("#");
				boolean flag=like(file.split("#"), (String) dmemo.file, blike);
				if(flag && !isAll((String)this.fmemo.ext)){
					flag=this.fmemo.ext.equals(dmemo.ext);
				}
				return flag;
			} else if(this.fmemo.type==FileFindType.EXT_LIKE){
				blike=rightStr(ext, 1).equals("#");
				boolean flag=like(ext.split("#"), (String) dmemo.file, blike);
				if(flag && !isAll((String)this.fmemo.file)){
					flag=this.fmemo.file.equals(dmemo.file);
				}
				return flag;
			}
		}
		return false;
	}
	
	/**
	 * ALL类型的模糊查询
	 * @param text
	 * @return
	 */
	private boolean isAll(String text){
		if(text==null) return true;
		if("".equals(text)) return true;
		if("*".equals(text)) return true;
		return false;
	}
	
	/**
	 * 是否为LIKE规则
	 * @param list
	 * @param text
	 * @param blike
	 * @return
	 */
	private boolean like(String[] list, String text, boolean blike){
		if(list!=null){
			int len=list.length;
			for(int i=0; i<len; i++){
				String sub=list[i];
				int pos=text.indexOf(sub);
				int tlen=text.length();
				if(!"".equals(sub) && i==0){
					if(pos!=0){
						return false;
					}	
				}
				if(!blike && i==len-1){
					if(!sub.equals(rightStr(text, sub.length()))){
						return false;
					}
				}
				if(pos>=0){
					text=rightStr(text, tlen-pos-sub.length()); 
				} else {
					return false;
				}
			}
		}
		return true;
	}
	
	/**
	 * 获取文件操作类型
	 * @param fileName
	 * @return
	 */
	private FileMemo getFileFileFindType(String fileName){
		if(fileName==null) return null;
		FileFindType ftype=null;
		String ext=null;
		String file=null;
		
		int pos=fileName.indexOf(".");
		int len=fileName.length();
		if(pos>0){
			ext=rightStr(fileName, len-pos-1);
			file=leftStr(fileName, pos);
		}
		
		int pos1=-1;
		boolean extAll=false;
		boolean extLike=false;
		boolean extSame=false;
		
		if(ext!=null){
			pos1=ext.indexOf("*");
			if(ext.equals("*")){
				extAll=true;
			} else if(pos1>=0){
				extLike=true;
			} else if(pos1<0 && !"".equals(ext)){
				extSame=true;
			}
		}
		
		boolean fileAll=false;
		boolean fileLike=false;
		boolean fileSame=false;
		if(file!=null){
			pos1=file.indexOf("*");
			if(file.equals("*")){
				fileAll=true;
			} else if(pos1>=0){
				fileLike=true;
			} else if(pos1<0 && !"".equals(file)){
				fileSame=true;
			}
		}
		
		if(extAll && fileAll){
			ftype=FileFindType.ALL;
		} else if(extAll){
			if(fileLike){
				ftype=FileFindType.FILE_LIKE;
			} else {
				ftype=FileFindType.EXT_ALL;
			}
		} else if(fileAll){
			if(extLike){
				ftype=FileFindType.EXT_LIKE;
			} else {
				ftype=FileFindType.FILE_ALL;
			}
			
		} else if(extLike && fileLike){
			ftype=FileFindType.LIKE;
		} else if(extLike){
			ftype=FileFindType.EXT_LIKE;
		} else if(fileLike){
			ftype=FileFindType.FILE_LIKE;
		
		} else if(extSame && fileSame){
			ftype=FileFindType.SAME;
		} else if(extSame){
			ftype=FileFindType.EXT;
		} else if(fileSame){
			ftype=FileFindType.FILE;
		}
		
		if(ext==null){
			ext="";
		}
		if(file==null){
			file="";
		}
		
		return new FileMemo<String, String, FileFindType>(file, ext, ftype);
	}
	

}
